package es.ucm.fdi.bdt.model;

import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.Map;

import es.ucm.fdi.bdt.utils.Util;

/**
 * Gestiona la obtención de datos de los ficheros distribuidos por la red en DHT.<br><br>
 * 
 * Padre de la jerarquía con operaciones comunes a todos los modelos.
 * 
 * Modelos
 * - AccountModel
 * - TransactionModel
 * - PublicReputationModel
 * - PrivateReputationModel
 * - AutomaticReputationModel
 * - BankingModel
 * - AgreementModel
 * - GLobalAgreementModel
 */
public class Model {
	
	/**
	 * Constructor por defecto
	 */
	public Model() {}
	
	/**
	 * Completa en este objeto los valores del {@link Map} pasado por parámetro.
	 * 
	 */
	public void setFields(Map<String, String> campos) {
		Iterator<Map.Entry<String, String>> it = campos.entrySet().iterator();
		
		while (it.hasNext()) {			
			Map.Entry<String, String> entry = it.next();
			String name = entry.getKey();
			String valor = entry.getValue();
			setField(name, valor);		
		}
	}
	
	/**
	 * Rellena en este objeto el valor especificado en "valor" en el campo "atributo".
	 * 
	 */
	public void setField(String nombreAtributo, String valorNuevo)
    {    	
    	if (valorNuevo != null) {
    		String nombreAtr = nombreAtributo.trim();
            
        	try{
        		Field[] declaredFields = this.getClass().getDeclaredFields();
    	    	for (Field f : declaredFields) {
    	    		Class fieldClass = f.getType();
        			if(nombreAtr.equals(f.getName())){
        				if(fieldClass.equals(Integer.class)){
        					f.set(this, (Util.getUtil().getInteger(valorNuevo)));
        				} else if(fieldClass.equals(Double.class)){
        					f.set(this, (Util.getUtil().getDouble(valorNuevo)));
        				} else {
        					f.set(this, (f.getType().cast(valorNuevo)));
        				}
        			}
    	    	}
        	}catch(Exception exception){
        		// Mensaje de error
        		//log.error("Excepción en el m�todo estableceCampo(String nombreAtributo, String valorNuevo): " + e.getMessage());	
        	}
    	}
    }

}
